Security News
JSR Working Group Kicks Off with Ambitious Roadmap and Plans for Open Governance
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
babel-plugin-emotion
Advanced tools
A recommended babel preprocessing plugin for emotion, The Next Generation of CSS-in-JS.
The babel-plugin-emotion npm package is designed to enhance the development experience when using Emotion, a popular CSS-in-JS library. It provides optimizations and custom transformations for styles defined in JavaScript, enabling more efficient and powerful styling solutions in React applications. This plugin facilitates the use of Emotion by offering features such as source maps for easier debugging, auto-labeling for better readability of class names, and the optimization of styles for production.
Source Maps
Generates source maps for styles, improving the debugging process by allowing developers to trace back to the original location of a style definition within their code.
"use strict";
var _emotion = require("@emotion/core");
function App() {
return /*#__PURE__*/_emotion.jsx("div", {
css: {
color: 'hotpink'
}
}, "Hello World");
}
Auto-labeling
Automatically adds labels to the generated class names based on the name of the variable or component. This enhances readability in the DOM and helps in identifying components during debugging.
"use strict";
var _emotion = require("@emotion/core");
var _styled = /*#__PURE__*/(0, _emotion.default)("div")
/*#__PURE__*/
.emotionLabel('MyComponent_styled_h1nx9f');
Optimization for Production
In production, the plugin optimizes the styles by compacting and efficient handling, reducing the size of the generated CSS and improving load times.
process.env.NODE_ENV === 'production' ? /*#__PURE__*/require('@emotion/css').css('label:MyComponent;', 'color:hotpink;') : /*#__PURE__*/require('@emotion/css').css('color:hotpink;');
Styled-components is another CSS-in-JS library that allows for styling applications using tagged template literals. While it offers similar functionality in terms of defining styles within JavaScript, it differs in syntax and the way styles are applied. Styled-components focuses on creating styled components without the need for a separate CSS file, whereas babel-plugin-emotion enhances the Emotion library's capabilities with additional compile-time optimizations and features.
This plugin is specifically designed for styled-components, offering similar compile-time enhancements as babel-plugin-emotion but for styled-components. It includes features like server-side rendering optimizations, better debugging with readable class names, and minification of styles for production. The comparison lies in the focus of each plugin on its respective CSS-in-JS library, providing tailored optimizations and developer experience improvements.
Babel plugin for the minification and optimization of emotion styles.
babel-plugin-emotion
is highly recommended, but not required in version 8 and
above of emotion
.
Feature/Syntax | Native | Babel Plugin Required | Notes |
---|---|---|---|
css`` | ✅ | ||
css(...) | ✅ | Generally used for object styles. | |
components as selectors | ✅ | Allows an emotion component to be used as a CSS selector. | |
Minification | ✅ | Any leading/trailing space between properties in your css and styled blocks is removed. This can reduce the size of your final bundle. | |
Dead Code Elimination | ✅ | Uglifyjs will use the injected /*#__PURE__*/ flag comments to mark your css and styled blocks as candidates for dead code elimination. | |
Source Maps | ✅ | When enabled, navigate directly to the style declaration in your javascript file. | |
Contextual Class Names | ✅ | Generated class names include the name of the variable or component they were defined in. |
In
const myStyles = css`
font-size: 20px;
@media (min-width: 420px) {
color: blue;
${css`
width: 96px;
height: 96px;
`};
line-height: 26px;
}
background: green;
${{ backgroundColor: 'hotpink' }};
`
Out
const myStyles = /* #__PURE__ */ css(
'font-size:20px;@media(min-width:420px){color:blue;',
/* #__PURE__ */ css('width:96px;height:96px;'),
';line-height:26px;}background:green;',
{ backgroundColor: 'hotpink' },
';'
)
yarn add --dev babel-plugin-emotion
or if you prefer npm
npm install --save-dev babel-plugin-emotion
.babelrc
(Recommended).babelrc
Without options:
{
"plugins": ["emotion"]
}
With options:
Defaults Shown
{
"plugins": [
[
"emotion",
{
// sourceMap is on by default but source maps are dead code eliminated in production
"sourceMap": true,
"autoLabel": process.env.NODE_ENV !== 'production',
"labelFormat": "[local]",
"cssPropOptimization": true
}
]
]
}
Recommended Setup
.babelrc
{
"plugins": ["emotion"]
}
babel --plugins babel-plugin-emotion script.js
require('@babel/core').transform('code', {
plugins: ['babel-plugin-emotion']
})
sourceMap
boolean
, defaults to true
.
This option enables the following:
Note:
Source maps are on by default in babel-plugin-emotion but they will be removed in production builds
autoLabel
boolean
, defaults to process.env.NODE_ENV !== 'production'
.
This option enables the following:
label
property to styles so that class names
generated by css
or styled
include the name of the variable the result is
assigned to.iconStyles$1
will become iconStyles1
) because $
is not valid
CSS ClassName SelectorIn
const brownStyles = css({ color: 'brown' })
Out
const brownStyles = /*#__PURE__*/ css({ color: 'brown' }, 'label:brownStyles;')
brownStyles
's value would be css-1q8eu9e-brownStyles
labelFormat
string
, defaults to "[local]"
.
This option only works when autoLabel
is set to true
. It allows you to
define the format of the resulting label
. The format is defined via string where
variable parts are enclosed in square brackets []
.
For example labelFormat: "my-classname--[local]"
, where [local]
will be replaced
with the name of the variable the result is assigned to.
Allowed values:
[local]
- the name of the variable the result of the css
or styled
expression is assigned to.[filename]
- name of the file (without extension) where css
or styled
expression is located.[dirname]
- name of the directory containing the file where css
or styled
expression is located.This format only affects the label property of the expression, meaning that the css
prefix and hash will
be prepended automatically.
In
// BrownView.js
// autoLabel: true
// labelFormat: '[filename]--[local]'
const brownStyles = css({ color: 'brown' })
Out
const brownStyles = /*#__PURE__*/ css(
{ color: 'brown' },
'label:BrownView--brownStyles;'
)
BrownView--brownStyles
's value would be css-hash-BrownView--brownStyles
In
const H1 = styled.h1({
borderRadius: '50%',
transition: 'transform 400ms ease-in-out',
boxSizing: 'border-box',
display: 'flex',
':hover': {
transform: 'scale(1.2)'
}
})
Out
const H1 = /*#__PURE__*/ styled('h1', {
label: 'H1'
})({
borderRadius: '50%',
transition: 'transform 400ms ease-in-out',
boxSizing: 'border-box',
display: 'flex',
':hover': {
transform: 'scale(1.2)'
}
})
H1
's class name attribute would be css-hash-H1
instances
Array<string>
, defaults to
;['emotion']
This option allows babel-plugin-emotion
to know which imports to treat as
emotion imports and transform as such. This option is only required if you
use a custom instance of emotion created with create-emotion
or you're
importing emotion from somewhere other than the paths above. Relative paths are
resolved relative to process.cwd()
(the current working directory).
cssPropOptimization
boolean
, defaults to true
if an import from @emotion/core
is found in a file.
This option assumes that you are using something to make @emotion/core
's jsx
function work for all jsx. If you are not doing so and you do not want such optimizations to occur, disable this option.
Instead of using babel-plugin-emotion
, you can use emotion with babel-plugin-macros
. Add babel-plugin-macros
to your babel config (which is included in Create React App 2.0) and use the imports/packages shown below.
import styled from 'react-emotion/macro'
import { css, keyframes, injectGlobal, flush, hydrate } from 'emotion/macro'
import css from '@emotion/css/macro'
import styled from '@emotion/styled/macro'
FAQs
A recommended babel preprocessing plugin for emotion, The Next Generation of CSS-in-JS.
The npm package babel-plugin-emotion receives a total of 1,632,885 weekly downloads. As such, babel-plugin-emotion popularity was classified as popular.
We found that babel-plugin-emotion demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
Security News
Research
An advanced npm supply chain attack is leveraging Ethereum smart contracts for decentralized, persistent malware control, evading traditional defenses.
Security News
Research
Attackers are impersonating Sindre Sorhus on npm with a fake 'chalk-node' package containing a malicious backdoor to compromise developers' projects.